/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package tipos;

/**
 *
 * Classe que representa o domínio data.
 * @author Lucas de Melo
 **/
public class Data {

    /**
     * Constante que representa o tamanho de uma data valida.
     */
    private static final int TAM_DATA = 8;
    /**
    * O método validar é responsável por validar uma determinada data
    * de acordo com os padrões especificados, isto é DD:MM:AA.
    * @param data Corresponde à data a ser validada
    * @exception NullPointerException
    * @exception IllegalArgumentException
    */
    public static void validar(final String data) {
       int ano = 0;
       int mes = 0;
       int dia = 0;
       int i = 0;

       if (data == null) {
           throw new NullPointerException("Data nula.");
       }
       if (data.length() != TAM_DATA) {
           throw new IllegalArgumentException("Tamanho de data inválido.");
       }
       /**
        * Calcula o valor do dia, verificando se este é composto de 2 dígitos.
        */
       for (i = 0; i < 2; i++) {
            if (!Character.isDigit(data.charAt(i))) {
                throw new IllegalArgumentException("Campo dia não composto"
                        + " apenas por números.");
            }
            dia = Integer.parseInt("" + data.charAt(0))
               * 10 + Integer.parseInt("" + data.charAt(1));
       }
       /**
        * Verifica a presença de ":" entre ano e mês no formato AA:MM:DD
        */
       if (data.charAt(i) != ':') {
           throw new IllegalArgumentException("Data invalida, não contém"
                   + " \":\" na terceira posição.");
       }
       /**
        * Calcula o valor do mês, verificando se este é composto de
        * 2 dígitos.
        */
       for (i = 3; i < 5; i++) {
            if (!Character.isDigit(data.charAt(i))) {
                throw new IllegalArgumentException("Campo mês não"
                        + " é composto apenas por dígitos.");
            }
            mes = Integer.parseInt(""  + data.charAt(3))
               * 10 + Integer.parseInt("" + data.charAt(4));
       }
       /**
        * Verifica a presença de ":" entre mês e dia no formato DD:MM:AA
        */
       if (data.charAt(i) != ':') {
           throw new IllegalArgumentException("Data inválida, não contém"
                   + " \":\" na sexta posição.");
       }
       /**
        * Calcula o valor do ano, verificando se este é composto de 2 dígitos.
        */
       for (i = 6; i < 8; i++) {
            if (!Character.isDigit(data.charAt(i))) {
                throw new IllegalArgumentException("Campo ano não é composto"
                        + " apenas por números.");
            }
            ano = Integer.parseInt("" + data.charAt(6))
               * 10 + Integer.parseInt("" + data.charAt(7));
       }
       /**
        * Verifica se dia é válido.
        */
       if (dia <= 0) {
           throw new IllegalArgumentException("Dia invalido,"
                   + " menor igual a zero");
       }
       /**
        * Verifica se o número do mês é válido.
        */
       if (mes <= 0 || mes > 12) {
           throw new IllegalArgumentException("Mes invalido,"
                   + " menor igual a zero ou maior que doze.");
       }
       /**
        * Verifica se o dia é válido para os meses de 31 dias.
        */
       if (mes == 1 || mes == 3  || mes == 5 || mes == 7
               || mes == 8 || mes == 10 || mes == 12) {
            if (dia > 31) {
                throw new IllegalArgumentException("Dia invalido, esse mês"
                        + " não possui 31 dias.");
            }
       /**
        * Verifica se o dia é válido para o mês de fevereiro, seja o ano
        * bissexto ou não.
        */
       } else if (mes == 2) {
                  if ((ano % 4 == 0 && ano % 100 != 0) || (ano % 400 == 0)) {
                        if (dia > 29) {
                            throw new IllegalArgumentException("Dia invalido,"
                                    + "o ano é bissexto, então fevereiro"
                                    + " não possui dias maiores que 29.");
                        }
              } else {
                      if (dia > 28) {
                          throw new IllegalArgumentException("Dia invalido,"
                                  + " o ano não é bissexto, então fevereiro"
                                  + " não possui dias maiores que 28.");
                      }
              }
       /**
       * Verifica se o dia é válido para os meses de 30 dias.
       */
       } else {
                if (dia > 30) {
                    throw new IllegalArgumentException("Dia invalido, esse mês"
                            + " não tem mais que 30 dias.");
                }
       }
    }
}
